<!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Docker</title>
        <style>
</style>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/katex.min.css" integrity="sha384-yFRtMMDnQtDRO8rLpMIKrtPCD5jdktao2TV19YiZYWMDkUR5GQZR/NOVTdquEx1j" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.css" rel="stylesheet" type="text/css">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/highlight.css">
<style>
            body {
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif;
                font-size: 14px;
                line-height: 1.6;
            }
        </style>
        <style>
.task-list-item { list-style-type: none; } .task-list-item-checkbox { margin-left: -20px; vertical-align: middle; }
</style>
        
        <script src="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.js"></script>
        
    </head>
    <body class="vscode-light">
        <h1 id="docker">Docker</h1>
<h2 id="概述">概述</h2>
<p>一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。开发者可以将环境等一起打包、发布到linux系统上，也可以实现虚拟化。</p>
<p>项目带环境打包！</p>
<p>Docker的核心思想是打包拆箱。</p>
<p>Docker十分轻巧，使用了最核心的环境。</p>
<p>基于Go语言开发的。</p>
<p>仓库地址： <a href="https://hub.docker.com">https://hub.docker.com</a></p>
<p>容器化：不是复制一个完整的操作系统。</p>
<h2 id="docker安装">Docker安装</h2>
<h3 id="查看官方文档">查看官方文档</h3>
<p><img src="file:///e:\notepad\notepad\docker\.%5Cdocker%5Cassets%5Cimage-20201118130850491.png" alt="文档入口"></p>
<p><img src="" alt="进入对应接口"></p>
<h3 id="安装对应的版本">安装对应的版本</h3>
<p><img src="" alt="image-20201118132901874"></p>
<p><img src="" alt="image-20201118132945683"></p>
<p>按着对应的步骤做，即可，以centos为例：</p>
<h4 id="1-卸载老的版本">1. 卸载老的版本</h4>
<pre><code class="language-bash"><div>yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
</div></code></pre>
<h4 id="2-从稳定的存储库中安装">2. 从稳定的存储库中安装</h4>
<pre><code class="language-bash"><div>yum install -y yum-utils
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo <span class="hljs-comment"># 此处为国外的仓库，使用国内的仓库</span>
<span class="hljs-comment"># http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span>

<span class="hljs-comment"># 更行yum软件包的索引</span>
yum makecache fast
</div></code></pre>
<h4 id="3-安装最新版的docker">3. 安装最新版的docker</h4>
<pre><code class="language-bash"><div>yum install docker-ce docker-ce-cli containerd.io
<span class="hljs-comment"># docker-ce 代表社区版</span>
</div></code></pre>
<p><strong>安装特殊版本的docker</strong></p>
<p><img src="" alt="安装特殊版本的docker"></p>
<h4 id="4-启动docker">4. 启动docker</h4>
<pre><code class="language-bash"><div>systemctl start docker
docker version <span class="hljs-comment"># 验证启动成功</span>
docker run hello-world <span class="hljs-comment"># 测试hello-world</span>
<span class="hljs-comment"># 使用docker images查看镜像</span>
</div></code></pre>
<p><img src="" alt="运行结果"></p>
<h4 id="5-查看镜像">5. 查看镜像</h4>
<p><img src="" alt="查看镜像"></p>
<h4 id="6-将docker当虚拟机使用">6. 将docker当虚拟机使用</h4>
<p><img src="" alt="image-20201118144152367"></p>
<p><img src="" alt="image-20201118144542462"></p>
<h2 id="简单案例">简单案例</h2>
<p>-v 将本地配置用到容器中</p>
<p>docker run -d -p 6379:6379 -v /usr/redis/redis.conf:/etc/redis/redis.conf -v /usr/redis/data:/data --name myredis redis:5.0.5 redis-server /etc/redis/redis.conf</p>
<p>运行：将内部22端口映射到5000，使用ssh可以连接</p>
<pre><code class="language-bash"><div>docker run -d -p 5000:22 --name master --privileged=<span class="hljs-literal">true</span> hub.c.163.com/public/centos:7.2-tools /usr/sbin/init <span class="hljs-comment"># 创建容器</span>

docker run -d --network=host --name=master --restart=always --privileged=<span class="hljs-literal">true</span> centos:master
<span class="hljs-comment"># -d: 后台运行容器，并返回容器ID；</span>
<span class="hljs-comment"># privileged=true,使用该参数，container内的root拥有真正的root权限。</span>
<span class="hljs-comment"># /usr/sbin/init 初始化用户</span>
<span class="hljs-comment"># 否则，container内的root只是外部的一个普通用户权限。</span>
<span class="hljs-comment"># --restart=always使用该执行开启重启自启动</span>
<span class="hljs-comment"># docker update --restart=always时也行</span>
<span class="hljs-comment"># 后台运行进入容器：docker exec -it 容器名 /bin/bash，进入后使用passwd修改密码</span>
<span class="hljs-comment"># 停止容器id，docker stop 容器ID</span>
<span class="hljs-comment"># docker rm 容器id， 删除容器</span>
<span class="hljs-comment"># --network host host模式启动可以访问宿主机网络</span>
</div></code></pre>
<h3 id="centos-7">CentOS 7</h3>
<p>开放/关闭指定端口</p>
<pre><code class="language-bash"><div><span class="hljs-comment"># 开启 80 端口，协议 tcp，--permanent 永久生效</span>
firewall-cmd --zone=public --add-port=80/tcp --permanent
 
<span class="hljs-comment"># 关闭端口</span>
firewall-cmd --zone=public --remove-port=80/tcp --permanent
 
<span class="hljs-comment"># 查看端口状态</span>
firewall-cmd --query-port=80/tcp
</div></code></pre>
<h3 id="centos-6">CentOS 6</h3>
<p>开放/关闭指定端口</p>
<pre><code class="language-bash"><div><span class="hljs-comment"># 开启 80 端口，协议 tcp</span>
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 
<span class="hljs-comment"># 关闭端口</span>
iptables -I INPUT -p tcp --dport 80 -j DROP
 
<span class="hljs-comment"># 保存</span>
service iptables save
</div></code></pre>
<p>查看端口</p>
<p>netstat -antp | grep sshd</p>
<h4 id="7-卸载dockercentos">7. 卸载docker(centos)</h4>
<pre><code class="language-bash"><div><span class="hljs-comment"># 卸载依赖</span>
yum remove docker-ce docker-ce-cli containerd.io
<span class="hljs-comment"># 删除资源</span>
rm -rf /var/lib/docker
<span class="hljs-comment"># /var/lib/docker docker的默认工作路径</span>
</div></code></pre>
<h2 id="docker是怎么工作的">Docker是怎么工作的？</h2>
<p>Docker是一个CS结构的系统，Docker的守护进城运行在主机上，通过Socket从客户端访问！</p>
<p>DockerServer接收到Docker-Client的指令，就执行这个命令。</p>
<h4 id="为什么docker比vm快">为什么Docker比VM快？</h4>
<ol>
<li>docker有着比虚拟机更少的抽象层。</li>
<li>docker利用的是宿主机的内核，vm需要是Guest OS</li>
</ol>
<hr>
<h2 id="docker常用命令">Docker常用命令</h2>
<h3 id="帮助命令">帮助命令</h3>
<pre><code class="language-bash"><div>docker version <span class="hljs-comment"># 版本信息</span>
docker info   <span class="hljs-comment"># 详细信息</span>
docker 命令 --<span class="hljs-built_in">help</span> <span class="hljs-comment"># 帮助命令</span>
</div></code></pre>
<h3 id="镜像命令">镜像命令</h3>
<h4 id="查看">查看</h4>
<pre><code class="language-bash"><div>docker images

Options:
  -a, --all             Show all images (default hides intermediate images) <span class="hljs-comment"># 显示所有的镜像</span>
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don<span class="hljs-string">'t truncate output
  -q, --quiet           Only show numeric IDs # 只显示镜像的id
</span></div></code></pre>
<h4 id="搜索">搜索</h4>
<pre><code class="language-bash"><div>docker search <span class="hljs-comment"># 镜像搜索命令</span>
</div></code></pre>
<h4 id="下载">下载</h4>
<pre><code class="language-bash"><div>docker pull 镜像名[:tag]
<span class="hljs-comment"># 不写tag默认是latest</span>
<span class="hljs-comment"># Pull complete # 分层下载， image的核心 联合文件系统，可能存在的依赖不下载了</span>
<span class="hljs-comment"># Digest： sha256xxxxx # 签名</span>
<span class="hljs-comment"># 最后一行，代表真实地址</span>
docker pull 镜像名:版本
</div></code></pre>
<h4 id="删除">删除</h4>
<pre><code class="language-bash"><div>docker rmi 镜像id1 镜像id2 .....
docker rmi -f $(docker images -aq) <span class="hljs-comment"># 删除所有</span>
</div></code></pre>
<h3 id="容器命令">容器命令</h3>
<pre><code class="language-bash"><div>docker pull centos <span class="hljs-comment"># 下载centos</span>
</div></code></pre>
<h4 id="新建容器并运行">新建容器并运行</h4>
<pre><code class="language-bash"><div>docker run [可选参数] 镜像 <span class="hljs-comment"># 通过run命令下载</span>

<span class="hljs-comment"># 参数说明</span>
--name=<span class="hljs-string">"容器名"</span>
-d <span class="hljs-comment">#后台方式运行</span>
-it <span class="hljs-comment">#使用交互方式运行，进入容器查看内容</span>
-p <span class="hljs-comment">#指定容器端口</span>
</div></code></pre>
<h4 id="列出所有运行的容器">列出所有运行的容器</h4>
<pre><code class="language-bash"><div>docker ps <span class="hljs-comment"># 列出正在运行的容器</span>
docker ps -a <span class="hljs-comment"># 列出所有的容器，包括退出的</span>
docker ps -n=? <span class="hljs-comment"># 显示最近创建的容器</span>
docker ps -q <span class="hljs-comment"># 只显示容器的编号</span>
</div></code></pre>
<h4 id="退出容器">退出容器</h4>
<pre><code class="language-bash"><div><span class="hljs-built_in">exit</span> <span class="hljs-comment"># 直接退出并停止</span>
ctrl + p + q <span class="hljs-comment"># 容器不停止退出</span>
</div></code></pre>
<h4 id="删除容器">删除容器</h4>
<pre><code class="language-bash"><div>docker rm 容器id <span class="hljs-comment"># 不能删除正在运行的</span>
docker rm -f $(docker ps -aq) <span class="hljs-comment"># 删除所有的容器</span>
docker ps -a -q|xargs docker rm <span class="hljs-comment"># 删除所有容器</span>
</div></code></pre>
<p>启动，停止容器</p>
<pre><code class="language-bash"><div>docker start 容器id
docker restart 容器id
docker stop 容器id
docker <span class="hljs-built_in">kill</span> 强制停止
</div></code></pre>
<h3 id="常用的其他命令">常用的其他命令</h3>
<h4 id="后台启动容器">后台启动容器：</h4>
<pre><code class="language-bash"><div>docker run -d 容器名
<span class="hljs-comment"># 如果容器中没有应用运行，docker可能会关了容器</span>
</div></code></pre>
<h4 id="查看日志">查看日志</h4>
<pre><code class="language-bash"><div>docker run -d centos /bin/sh -c 下面的脚本
<span class="hljs-comment"># 自己写一段shell脚本</span>
<span class="hljs-keyword">while</span> <span class="hljs-literal">true</span>;
<span class="hljs-keyword">do</span> <span class="hljs-built_in">echo</span> 输出语句; 
sleep 1;
<span class="hljs-keyword">done</span>

<span class="hljs-comment"># 显示指定行数</span>
docker logs -f -t --tail <span class="hljs-comment"># 容器日志</span>
<span class="hljs-comment"># 日志</span>
-tf <span class="hljs-comment"># 显示日志</span>
--tail number <span class="hljs-comment"># 要显示的日志数</span>
</div></code></pre>
<h4 id="docker内部的进程信息">docker内部的进程信息</h4>
<pre><code class="language-bash"><div>docker top 容器id
</div></code></pre>
<h4 id="查看镜像的元数据">查看镜像的元数据</h4>
<pre><code class="language-bash"><div>docker inspect 容器id
</div></code></pre>
<h4 id="进入当前容器">进入当前容器</h4>
<pre><code class="language-bash"><div>docker <span class="hljs-built_in">exec</span> -it 容器id bashshell 
docker <span class="hljs-built_in">exec</span> -it 容器id /bin/bash <span class="hljs-comment"># 进入容器后，打开新的终端</span>
docker attach 容器id <span class="hljs-comment"># 进入容器正在运行的终端</span>
</div></code></pre>
<h4 id="从容器中拷贝东西">从容器中拷贝东西</h4>
<pre><code class="language-bash"><div>docker cp 容器id: /home/文件  存放的路径
</div></code></pre>
<h2 id="docker镜像">Docker镜像！</h2>
<h3 id="window修改镜像源">window修改镜像源</h3>
<p><img src="" alt="window修改镜像"></p>
<h3 id="linux配置镜像">linux配置镜像</h3>
<p>新建配置文件</p>
<pre><code><code><div>/etc/docker/daemon.json
</div></code></code></pre>
<p>输入以下内容</p>
<pre><code><code><div>{&quot;registry-mirrors&quot;: [&quot;镜像加速器地址&quot;]}
</div></code></code></pre>
<p>重启docker服务即可</p>
<pre><code><code><div>systemctl daemon-reload
systemctl restart docker
</div></code></code></pre>
<h2 id="练习安装nginxtomcatmysql等等alph代表瘦身版">练习：安装nginx，Tomcat，mysql等等（alph代表瘦身版）</h2>
<pre><code class="language-bash"><div>docker pull nginx
</div></code></pre>
<h2 id="远程开发">远程开发</h2>
<p>linux开启远程:</p>
<p>修改/usr/lib/systemd/system/docker.service,</p>
<p>修改前:</p>
<pre><code class="language-bash"><div>ExecStart=/usr/bin/dockerd -H fd:// 
</div></code></pre>
<p>修改后:</p>
<pre><code class="language-bash"><div>ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375
</div></code></pre>
<p>重启所有容器:</p>
<p>systemctl restart docker</p>
<p>最后,修改连接参数:</p>
<p>方法1:</p>
<pre><code class="language-bash"><div>docker -H 127.0.0.1:2375 info
</div></code></pre>
<p>方法2:</p>
<pre><code class="language-bash"><div><span class="hljs-built_in">export</span> DOCKER_HOST=<span class="hljs-string">"tcp://127.0.0.1:2375"</span>
docker info
</div></code></pre>
<p>测试:</p>
<pre><code class="language-cpp"><div>curl http:<span class="hljs-comment">//127.0.0.1:2375/info</span>
</div></code></pre>
<p>window开启方法</p>
<p><img src="" alt="image-20201120112017405"></p>
<h2 id="导出导入容器快照">导出导入容器(快照)</h2>
<p>导出:docker export 容器id &gt; 容器快照名</p>
<p>导入:docker import [命令, -c <strong>应用docker指令</strong>创建镜像, -m提交时的说明文字] file|URL [[自定义仓库名]:版本]</p>
<h2 id="镜像保存与载入">镜像保存与载入</h2>
<p>载入:docker load &lt; 镜像 window上:docker load -i 镜像</p>
<p>保存:docker save -o 输出文件 镜像</p>
<p>docker save 镜像&gt;输出文件</p>
<h2 id="容器提交成镜像">容器提交成镜像</h2>
<pre><code class="language-bash"><div>docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
</div></code></pre>
<p>-a :提交的镜像作者；</p>
<p>-c :使用Dockerfile指令来创建镜像；</p>
<p>-m :提交时的说明文字；</p>
<p>-p :在commit时，将容器暂停</p>
<h2 id="传输文件">传输文件</h2>
<pre><code class="language-bash"><div>docker cp container_id:&lt;docker容器内的路径&gt; &lt;本地保存文件的路径&gt;
docker cp 本地文件的路径 container_id:&lt;docker容器内的路径&gt;
</div></code></pre>

    </body>
    </html>